home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 2.toast / pc / sample code / quicktime / all macintosh / streaming / qtspacketizerreassembler / imaaudiortp / sources / tqueue.c < prev   
Encoding:
C/C++ Source or Header  |  2000-06-23  |  2.2 KB  |  173 lines

  1. /*
  2.     File:        TQueue.c
  3.  
  4.     Contains:    Definition of operations for TQueue, a generic queue datatype
  5.  
  6.     Copyright:    © 1997-1999 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10.  
  11.  
  12. #include "TQueue.h"
  13.  
  14.  
  15.  
  16. typedef struct __cElement
  17. {
  18.     TCycle    __itsLink;
  19.     void *    __itsPayload;
  20. } __cElement;
  21.  
  22.  
  23.  
  24. static
  25. __cElement **
  26. __ElementNew(
  27.     void *    inPayload )
  28. {
  29.     __cElement **    __elementNew;
  30.     
  31.     
  32.     __elementNew = ( __cElement ** ) CycleNew( sizeof( **__elementNew ) );
  33.     
  34.     if( __elementNew )
  35.         ( **__elementNew ).__itsPayload = inPayload;
  36.     
  37.     return( __elementNew );
  38. }
  39.  
  40.  
  41.  
  42. static
  43. TCycle **
  44. __ElementCycle(
  45.     __cElement **    inElement )
  46. {
  47.     return( ( TCycle ** ) inElement );
  48. }
  49.  
  50.  
  51.  
  52. static
  53. void *
  54. __ElementPayload(
  55.     __cElement **    inElement )
  56. {
  57.     return( ( **inElement ).__itsPayload );
  58. }
  59.  
  60.  
  61.  
  62. static
  63. void
  64. __ElementDispose(
  65.     __cElement **    inElement )
  66. {
  67.     CycleDispose( ( TCycle ** ) inElement );
  68. }
  69.  
  70.  
  71.  
  72. extern
  73. void
  74. QueueInitialize(
  75.     TQueue *    inQueue )
  76. {
  77.     if( inQueue )
  78.     {
  79.         inQueue->__itsList = 0;
  80.         inQueue->__itsCount = 0;
  81.     }
  82. }
  83.  
  84.  
  85.  
  86. extern
  87. UInt32
  88. QueueCount(
  89.     const TQueue *        inQueue )
  90. {
  91.     UInt32    queueCount = 0;
  92.     
  93.     
  94.     if( inQueue )
  95.         queueCount = inQueue->__itsCount;
  96.     
  97.     return( queueCount );
  98. }
  99.  
  100.  
  101.  
  102. extern
  103. void *
  104. QueueHead(
  105.     const TQueue *    inQueue )
  106. {
  107.     void *    queueHead = 0;
  108.     
  109.     
  110.     if( inQueue  &&  inQueue->__itsList )
  111.         queueHead = __ElementPayload( ( __cElement ** ) CycleNext( inQueue->__itsList ) );
  112.     
  113.     return( queueHead );
  114. }
  115.  
  116.  
  117.  
  118. extern
  119. void *
  120. QueueEnqueue(
  121.     TQueue *    inQueue,
  122.     void *        inElement )
  123. {
  124.     void *            queueEnqueue = 0;
  125.     __cElement **    theElement;
  126.     
  127.     
  128.     if( inQueue  &&  inElement )
  129.     {
  130.         theElement = __ElementNew( inElement );
  131.         
  132.         if( theElement )
  133.         {
  134.             if( inQueue->__itsList )
  135.                 CyclePut( inQueue->__itsList, __ElementCycle( theElement ) );
  136.             
  137.             inQueue->__itsList = __ElementCycle( theElement );
  138.             inQueue->__itsCount++;
  139.             
  140.             queueEnqueue = inElement;
  141.         }
  142.     }
  143.     
  144.     return( queueEnqueue );
  145. }
  146.  
  147.  
  148.  
  149. extern
  150. void *
  151. QueueDequeue(
  152.     TQueue *    inQueue )
  153. {
  154.     void *            queueDequeue = 0;
  155.     __cElement **    theElement;
  156.     
  157.     
  158.     if( inQueue  &&  inQueue->__itsList )
  159.     {
  160.         theElement = ( __cElement ** ) CycleGet( inQueue->__itsList );
  161.         
  162.         queueDequeue = __ElementPayload( theElement );
  163.         __ElementDispose( theElement );
  164.         
  165.         --inQueue->__itsCount;
  166.         
  167.         if( !inQueue->__itsCount )
  168.             inQueue->__itsList = 0;
  169.     }
  170.     
  171.     return( queueDequeue );
  172. }
  173.